package com.lhh.springcommon.utils;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

/**
 * 代码生成器
 * @author 李厚航
 */
public class MyGenerator {

    /**
     * 数据库表名
     */
    private static final String[] TABLE_NAME = new String[]{
            "chat",
            "collect",
            "comment",
            "follow",
            "history",
            "like",
            "user",
            "video"
    };

    /**
     * 项目作者名
     */
    private static final String AUTHOR = "李厚航";

    /**
     * 数据库配置
     */
    private static final String DB_SOURCE_URL = "jdbc:mysql://127.0.0.1:3306/video-recommendation-system?characterEncoding=utf-8";

    /**
     * 数据库账号
     */
    private static final String DB_USERNAME = "root";

    /**
     * 数据库密码
     */
    private static final String DB_PASSWORD = "1905120210";

    /**
     * 文件输出目录
     */
    private static final String DIR = System.getProperty("user.dir") + "/spring-common/src/main";

    /**
     * 父包名
     */
    private static final String PARENT = "com.lhh.springcommon";

    /**
     * mybatis-plus代码生成器
     */
    public static void generator(){
        FastAutoGenerator.create(DB_SOURCE_URL, DB_USERNAME, DB_PASSWORD)
                //全局配置
                .globalConfig(builder -> {
                    builder.author(AUTHOR) // 设置作者
                            .enableSwagger() // 开启 swagger 模式
//                            .fileOverride() // 覆盖已生成文件
                            .outputDir(DIR + "/java") // 指定输出目录
                            .commentDate("yyyy-MM-dd")//注释日期
                            .dateType(DateType.TIME_PACK);//时间策略
                })
                //包配置
                .packageConfig(builder -> {
                    builder.parent(PARENT) // 设置父包名
                            .mapper("mapper")
                            .service("service")
                            .serviceImpl("service.Impl")
                            .controller("controller")
                            .entity("entity")
                            .xml("mapper.xml")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, DIR + "/resources/mapper")); // 设置mapperXml生成路径
                })
                //策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(TABLE_NAME)
//                            .addTablePrefix("sys_")//设置表前缀过滤
                            .controllerBuilder()//controller策略配置
                            .enableRestStyle()//开启@RestController注解
                            .serviceBuilder()//service策略配置
//                            .superServiceClass(IService.class)//service接口继承IService
//                            .superServiceImplClass(ServiceImpl.class)//serviceImpl(本项目)继承serviceImpl(mybatis-plus)
                            .mapperBuilder()//mapper策略配置
                            .enableMapperAnnotation()//开启@Mapper注解
//                            .superClass(BaseMapper.class)//实体类继承BaseMapper
                            .entityBuilder()//entity策略配置
                            .enableLombok()//开启Lombok模型
                            .enableTableFieldAnnotation()//开启生成实体时生成字段注解
                            .naming(NamingStrategy.underline_to_camel)//表下划线转驼峰命名
                            .columnNaming(NamingStrategy.underline_to_camel)//表字段命名规则：下划线转驼峰
                            .idType(IdType.ASSIGN_ID);//全局主键类型
//                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                })
                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

    public static void main(String[] args) {
        generator();
    }
}
